Zu Beginn werden erstmal die nötigen Pakte installiert:
if(!require("install.load")){
install.packages("install.load")
}
library(install.load)
install_load("readr", "dplyr", "ggplot2", "knitr","tidyverse","plotly","moments")
Als erstes werden die nötigen Daten importiert/geladen!
Komponente_K7 <- read.csv2("DATA/Logistikverzug/Komponente_K7.csv")
Logistikverzug_K7 <- read.csv("DATA/Logistikverzug/Logistikverzug_K7.csv",sep=";")
In dieser Aufgabe untersuchen wir die Verteilung des Logistikverzugs der Komponente K7. Zunächst einmal werden die beiden eingelesenden Datasets zu Logistikverzug zusammengefügt. Dies passiert unter der Angabe der IDNummer. Im nächsten Schritt werden die Produktionsdaten gefiltert, sodass nur die Daten von 2014 bis 2016 betrachtet werden.
Logistikverzug <- merge(x = Komponente_K7[,c("IDNummer", "Produktionsdatum")], y = Logistikverzug_K7[ , c("IDNummer","Wareneingang")], by = "IDNummer")
Logistikverzug <- Logistikverzug %>%
filter(Produktionsdatum >= as.Date("2014-01-01") & Produktionsdatum <= as.Date("2016-12-31"))
Zur besseren Übersicht und zum Vergleich wird nun das Datumsformat für den Wareneingang angepasst. Es wird das Format Y-m-d genutzt.
Logistikverzug$Wareneingang <- as.Date(strptime(Logistikverzug$Wareneingang, format = "%d.%m.%Y"), format = "%Y-%m-%a")
Nun wird der Verzug berechnet. Hierbei ist zu beachten, dass zwischen dem Produktionsdatum und dem Warenausgangsdatum 2 Werktage liegen, da der Hersteller 1 Tag für die Übergabe zur Logistikabteilung und ebenfalls 1 Tag für die Versandvorbereitung benötigt. Da der Sonntag kein Werktag ist, ist dieser von der Rechnung ausgeschlossen.
Verzug <- as.integer(difftime(Logistikverzug$Wareneingang, Logistikverzug$Produktionsdatum, units = "days")) - 2
Verzug_arbeitstage <- Verzug[weekdays(Logistikverzug$Wareneingang) != "Sunday"]
Nun wird ein Histogramm mit den Verzugsdaten dargestellt:
hist(Verzug_arbeitstage, breaks = 10, main = "Histogramm des Logistikverzugs", xlab = "Verzug in Tagen", ylab = "Anzahl")
Das Histogramm deutet darauf hin, dass die logistische Verzögerung einer Normalverteilung folgen könnte. Dies ist durch eine glockenähnliche Struktur der Balken zu erkennen.
Ein Q-Q-Plot kann verwendet werden, um die Annahme zu überprüfen, dass die Daten des logistischen Verzugs einer bestimmten theoretischen Verteilung folgen. Der Q-Q-Plot vergleicht die empirischen Quantile der Daten mit den theoretischen Quantilen der angenommenen Verteilung. Wenn die empirischen und theoretischen Quantile eng beieinander liegen, deutet dies darauf hin, dass die empirischen Daten ähnlich wie die angenommene Verteilung verteilt sind.
qqnorm(Verzug_arbeitstage)
qqline(Verzug_arbeitstage, col="red")
Das Q-Q-Plot zeigt, dass die Daten recht nahe an der linearen roten Linie liegen, jedoch sind einige zum Teil erhebliche Abweichungen zu erkennen.
Deswegen wird nun der Shapiro-Wilk-Test hinzugezogen, dabei wird aus den Daten eine zufällige Stichprobe von 5000 Datenpunkten verwendet:
shapiro.test(sample(Verzug_arbeitstage, 5000))
##
## Shapiro-Wilk normality test
##
## data: sample(Verzug_arbeitstage, 5000)
## W = 0.90293, p-value < 2.2e-16
Der Wert W = 0.89834 nahe 1 zeigt zunächst einmal eine gute Übereinstimmung mit der Normalverteilung. Der p-Wert = 2.2e-16 ist hingegen viel kleiner als das Signifikanzniveau 0.05. Die Abweichung ist so gravierend, dass die Normalverteilung eindeutig verworfen wird. Eindeutig ist zu erkennen, dass viele Datenpaare auf der rechten Seite des Maximas liegen, während nach links die Werte durch die 0 begrenzt sind und somit auf eine Schiefheit hinweisen könnten.
Um eine schiefe Verteilung zu testen, eignet sich der Skewness-Test:
skewness_test <- skewness(Verzug_arbeitstage)
skewness_test
## [1] 0.5610644
Der Wert 0.5610644 indiziert hierbei eine rechtsschiefe Verteilung.
Ergebnis: Die Daten liegen unter einer rechtsschiefen Verteilung vor!
Der minimale Verzug und der maximaler Verzug werden bestimmt durch:
min(Verzug_arbeitstage)
## [1] 0
Der Minimalwert beträgt damit 0 Tage.
max(Verzug_arbeitstage)
## [1] 10
Der Maximalwert beträgt damit 10 Tage.
Hier wird nun der Mittelwert des Logistiksverzuges bestimmt:
mean(Verzug_arbeitstage)
## [1] 3.080826
Der Mittelwert des Verzuges liegt bei ungefähr 3.08 Tagen.
fig <- plot_ly(x = Verzug_arbeitstage, type = "histogram", nbinsx = 50)
fig <- fig %>%
layout(
title = "Histogramm des Verzugs",
xaxis = list(title = "Verzug in Tagen"),
yaxis = list(title = "Häufigkeit")
)
fig
Warum ist es sinnvoll, die Ihnen bereitgestellten Daten in separaten Dateien abzulegen und nicht alles in einer riesigen Tabelle abzuspeichern? Wie nennt sich das zugrunde liegende Datenbankkonzept?
Das zugrundeliegende Datenbankkonzept wird als relationales Datenbankmodell bezeichnet. Dieses bietet folgende Vorteile:
Wie viele der Komponenten K7 landeten in Fahrzeugen, die in Wehr, Landkreis Waldshut zugelassen wurden?
Zunächst einmal werden die benötigten Dateien eingelesen:
k7 <- as_tibble(read.table("DATA/Komponente/Komponente_K7.txt", sep = "\t", stringsAsFactors = FALSE))
zulassungen <- read_csv2("DATA/Zulassungen/Zulassungen_alle_Fahrzeuge.csv")
komponenten_OEM1_typ11 <- read_csv2("DATA/Fahrzeug/Bestandteile_Fahrzeuge_OEM1_Typ11.csv")
komponenten_OEM1_typ12 <- read_csv2("DATA/Fahrzeug/Bestandteile_Fahrzeuge_OEM1_Typ12.csv")
komponenten_OEM2_typ21 <- read_csv2("DATA/Fahrzeug/Bestandteile_Fahrzeuge_OEM2_Typ21.csv")
komponenten_OEM2_typ22 <- read_csv2("DATA/Fahrzeug/Bestandteile_Fahrzeuge_OEM2_Typ22.csv")
Nun werden die nötigen Spalten der Dateien jeweiligen Dateien nach ID_Fahrzeug, ID_Karosserie gefiltert und in ein übersichtlicheres Dataframe übernommmen:
k7_neu <- k7 %>%
dplyr::select(ID_Karosserie)
zulassungen_neu <- zulassungen %>%
dplyr::select(IDNummer, Gemeinden, Zulassung) %>%
rename(ID_Fahrzeug = IDNummer)
komponenten_OEM1_typ11_neu <- komponenten_OEM1_typ11 %>%
dplyr::select(ID_Fahrzeug, ID_Karosserie)
komponenten_OEM1_typ12_neu <- komponenten_OEM1_typ12 %>%
dplyr::select(ID_Fahrzeug, ID_Karosserie)
komponenten_OEM2_typ21_neu <- komponenten_OEM2_typ21 %>%
dplyr::select(ID_Fahrzeug, ID_Karosserie)
komponenten_OEM2_typ22_neu <- komponenten_OEM2_typ22 %>%
dplyr::select(ID_Fahrzeug, ID_Karosserie)
Nun werden alle vorherigen Dataframes zusammengesammmelt und in ein Dataframe abgespeichert mit den dazugehörigen Daten:
komponenten_total <- rbind(komponenten_OEM1_typ11_neu, komponenten_OEM1_typ12_neu, komponenten_OEM2_typ21_neu, komponenten_OEM2_typ22_neu)
abschlussdaten <- left_join(k7_neu, komponenten_total, by = "ID_Karosserie") %>%
left_join(zulassungen_neu, by = "ID_Fahrzeug")
Abschließend kann nun aus den Abschlussdaten die Anzahl der Fahrzeuge, die die Komponente enthalten und in Wehr zugelassen wurden, gefiltert werden:
fahrzeuge_wehr_k7 <- filter(abschlussdaten, Gemeinden == "WEHR") %>%
summarise(Amount_Cars_in_Wehr = n())
fahrzeuge_wehr_k7
## # A tibble: 1 × 1
## Amount_Cars_in_Wehr
## <int>
## 1 6
Es gibt 6 Fahrzeuge, die die Komponente K7 enthalten und in Wehr zugelassen wurden!
Welche Datentypen haben die Attribute der Zulassungstabelle „Zulassungen_aller_Fahrzeuge“? Erstellen Sie dazu eine Tabelle in Markdown.
Die Datei “Zulassungen_alle_Fahrzeuge” ist bereits in Aufgabe 3 eingelesen worden und kann weiterhin genutzt werden.
Um den Datentyp zu identifizieren, kann die Funktion str() genutzt werden:
str(zulassungen)
## spc_tbl_ [3,204,104 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ ...1 : num [1:3204104] 408097 408098 1 2 3 ...
## $ IDNummer : chr [1:3204104] "11-1-11-1" "11-1-11-2" "12-1-12-1" "12-1-12-2" ...
## $ Gemeinden: chr [1:3204104] "DRESDEN" "DRESDEN" "LEIPZIG" "LEIPZIG" ...
## $ Zulassung: Date[1:3204104], format: "2009-01-01" "2009-01-01" ...
## - attr(*, "spec")=
## .. cols(
## .. ...1 = col_double(),
## .. IDNummer = col_character(),
## .. Gemeinden = col_character(),
## .. Zulassung = col_date(format = "")
## .. )
## - attr(*, "problems")=<externalptr>
Es ist zu erkennen, dass die Zulassungstabelle die 4 Spalten besitzt mit “…1” als numeric double, “IDNumner” als character, “Gemeinde” als character und “Zulassung” als date.
Hier ist die dazugehörige Tabelle zu sehen:
spaltennamen_zulassung <- names(zulassungen)
datentypen_zulassungen <- c(class(zulassungen$...1), class(zulassungen$IDNummer), class(zulassungen$Gemeinden), class(zulassungen$Zulassung))
tabelle <- data.frame(Spaltenname = spaltennamen_zulassung, Datentyp = datentypen_zulassungen)
kable(
tabelle,
caption = "Zulassung alles Fahrzeuge",
format = "markdown",
booktabs = TRUE
)
| Spaltenname | Datentyp |
|---|---|
| …1 | numeric |
| IDNummer | character |
| Gemeinden | character |
| Zulassung | Date |
Sie wollen Ihre Applikation veröffentlichen. Warum ist es gerade dann sinnvoll die Datensätze auf der Datenbank eines Servers abzulegen?
Verfügbarkeit:
Datenorganisation:
Warum können Sie die Datensätze nicht auf Ihrem persönlichen Computer ablegen?
Begrenzte Ressourcen:
Datenverlust:
Nennen Sie eine einfache Möglichkeit Ihre Applikation ihrem Kundenkreis zugänglich zu machen?
Eine Mölichkeit ist die Bereitstellung über das Internet mittels einer Webanwendung. Benutzer können einfach über ihren Webbrowser auf die Anwendung zugreifen, ohne dass sie zusätzliche Software installieren müssen.
Eine Alternative wäre die Veröffentlichung der Applikation über einen App Store oder eine ähnliche Plattform für den Download und die Installation auf den Endgeräten der Benutzer.
Am 11.08.2010 hat es einen Unfall mit Fahrerflucht gegeben. Von dem Kennzeichen des Unfallwagens fehlt jede Spur. Die Polizei bittet Sie um Hilfe, da Sie für das Kraftfahrtbundesamt arbeiten und fragt, wo das Fahrzeug mit der Karosseriebauteilnummer „K7-114-1142-31“ zugelassen wurde.
komponenten_mit_zulassungen <- left_join(zulassungen_neu, komponenten_total, by = "ID_Fahrzeug")
ort <- filter(komponenten_mit_zulassungen, ID_Karosserie == "K7-114-1142-31")
ort
## # A tibble: 1 × 4
## ID_Fahrzeug Gemeinden Zulassung ID_Karosserie
## <chr> <chr> <date> <chr>
## 1 22-2-22-2 ALLENDORF (EDER) 2009-01-02 K7-114-1142-31
Das Fahrzeug mit der Kassoriebauteilnummer „K7-114-1142-31“ wurde in Allendorf (Eder) zugelassen.